package capstoneproject.dudiachi.Controller;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import capstoneproject.dudiachi.DataAccess.DBHelper;
import capstoneproject.dudiachi.Model.Place;
import capstoneproject.dudiachi.Model.PlaceType;
import capstoneproject.dudiachi.Model.Province;
import capstoneproject.dudiachi.Model.TagType;

public class PlaceManager {
	private ArrayList<Place> listPlace;
	private DBHelper helper;
	private ProvinceManager pm;
	private PlaceTypeManager ptm;
	/**
	 * <pre>
	 * タッグ�?�データ列�?�行�?�インデックスを�?��?��?��?�。
	 * </pre>
	 */
	private List<TagType> listTag;

	/**
	 * <pre>
	 * コンストラクタ。 
	 * 祭りリストを�?��?��?�をロード。
	 * </pre>
	 * 
	 * @param ctx
	 */
	public PlaceManager(Context ctx) {
		super();
		helper = new DBHelper(ctx);
		listPlace = new ArrayList<Place>();
		listTag = new ArrayList<TagType>();
		loadListPlace();
		pm = new ProvinceManager(ctx);
		ptm = new PlaceTypeManager(ctx);
	}

	/**
	 * Placeテーブル�?�らデータを�?��?��?��?{@link Place}型�?��?列リスト�?�入れ�?��?�。
	 * 
	 * @throws SQLException
	 */
	private void loadListPlace() throws SQLException {
		helper.open();

		String[] columns = { Place.COLUMN0, Place.COLUMN1, Place.COLUMN2,
				Place.COLUMN3, Place.COLUMN4, Place.COLUMN5, Place.COLUMN6,
				Place.COLUMN7, Place.COLUMN8, Place.COLUMN9, Place.COLUMN10,
				Place.COLUMN11, Place.COLUMN12, Place.COLUMN13, Place.COLUMN14,
				Place.COLUMN15, Place.COLUMN16 };
		Cursor c = helper.getData(Place.TABLE_NAME, columns, null, null, null); // con
																				// tro
																				// chi
																				// den
																				// dong'
																				// output
																				// cua
		// ham
		// query()
		c.moveToFirst(); // chuyen den dong dau tien
		// get cac dong ra va them vao arraylist

		while (c.isAfterLast() == false) {
			Place objPlace = new Place(c.getString(0), c.getString(1),
					c.getString(2), c.getString(3), c.getString(4),
					c.getString(5), c.getString(6), c.getString(7),
					c.getString(8), c.getString(9), c.getString(10),
					c.getString(11), c.getString(12), c.getDouble(13),
					c.getDouble(14), c.getString(15), c.getString(16));
			listPlace.add(objPlace);
			TagType wtf = new TagType(c.getPosition(), c.getString(16));
			listTag.add(wtf);
			c.moveToNext();
		}
		helper.close();
	}

	/**
	 * タッグ�?�探�?��?��?�。
	 * 
	 * @param tag
	 *            　ストリング型�?�入力
	 * @return　{@link Place}型�?��?列リスト型�?�変数
	 */
	@SuppressLint("DefaultLocale")
	public ArrayList<Place> searchByTag(String tag) {
		ArrayList<Place> result = new ArrayList<Place>();
		for (TagType t : listTag) {
			if (t.getTag().toLowerCase().contains(tag.toLowerCase())) {
				result.add(listPlace.get(t.getPosition()));
			}
		}
		return result;
	}

	/**
	 * ゲッター
	 * 
	 * @return
	 */
	public ArrayList<Place> getListPlace() {

		return listPlace;
	}

	/**
	 * 「ProvinceID]�?�探�?��?��?�。
	 * 
	 * @return　「Province�?型�?��?列
	 */
	public ArrayList<Place> searchByProvince(String provinceID) {
		ArrayList<Place> result = new ArrayList<Place>();
		for (Place od : listPlace) {
			if (od.getProvince().equalsIgnoreCase(provinceID)) {
				result.add(od);
			}
		}
		return result;
	}

	/**
	 * 「PlaceTypeID]�?�探�?��?��?�。
	 * 
	 * @return　「Province�?型�?��?列
	 */
	public ArrayList<Place> searchByPlaceType(String placeTypeID) {
		ArrayList<Place> result = new ArrayList<Place>();
		for (Place od : listPlace) {
			if (od.getProvince().equalsIgnoreCase(placeTypeID)) {
				result.add(od);
			}
		}
		return result;
	}

	/**
	 * 親行を�?�得�?��?��?�。
	 * 
	 * @param id
	 *            　「ProvinceID�?
	 * @return　「Province�?型�?�オブジェクト
	 */
	public Province getFKProvince(String id) {
		return pm.searchByID(id);
	}

	/**
	 * 親行を�?�得�?��?��?�。
	 * 
	 * @param id
	 *            　「PlaceTypeID�?
	 * @return　「PlaceType�?型�?�オブジェクト
	 */
	public PlaceType getFKPlaceType(String id) {
		return ptm.searchByID(id);
	}

	/**
	 * 「id]�?�探�?��?��?�。
	 * 
	 * @return　１�?�「Place�?
	 */
	public Place searchByID(String id) {
		for (Place p : listPlace) {
			if (p.getPlaceID().equalsIgnoreCase(id)) {
				return p;
			}
		}
		return null;
	}
}
